
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>JVM中的线程与并发管理 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>JVM中的线程与并发管理 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">JVM中线程的生命周期包含哪五个状态？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">JVM中的线程生命周期包括五个状态：新建（New）、就绪（Runnable）、运行中（Running）、阻塞（Blocked）和终止（Terminated）。</div>
          </div>
          <div class="card-source">来源: JVM中的线程基础 - 2. 线程的生命周期</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Java中创建线程有哪些常见的方式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在JVM中，创建线程有两种常见方式：1. 继承Thread类，并重写其run()方法。2. 实现Runnable接口，并重写其run()方法，然后将该实现类的实例传递给Thread对象。</div>
          </div>
          <div class="card-source">来源: JVM中的线程基础 - 3. 线程的创建</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">JVM中的线程与操作系统的线程之间是怎样的关系？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">大多数现代JVM采用“本地线程”模型，这意味着JVM中的每个Java线程都映射到一个对应的操作系统本地线程（1:1映射）。因此，JVM的线程调度和切换基本依赖于操作系统的线程管理机制。</div>
          </div>
          <div class="card-source">来源: JVM的线程模型 - 3. JVM的线程模型与操作系统的交互</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">volatile关键字在并发编程中主要解决了什么问题？它与synchronized相比有何局限性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">volatile关键字保证了共享变量的值在多个线程之间是可见的，即当一个线程修改变量值后，其他线程能立刻看到最新值。它的局限性在于只能确保可见性，无法保证原子性和互斥性，因此不能完全替代synchronized关键字。</div>
          </div>
          <div class="card-source">来源: 线程同步机制 - 2.2 volatile 关键字</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">什么是读写锁（Read-Write Lock）？它适用于什么样的场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">读写锁允许多个线程同时读取共享资源，但写操作必须独占访问。这种锁机制适用于读操作远比写操作频繁的场景，可以显著提高并发性能。</div>
          </div>
          <div class="card-source">来源: 线程同步机制 - 2.4 读写锁（Read-Write Lock）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">使用线程池（Thread Pool）主要有哪些优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">使用线程池的优势包括：1. 性能提升，通过重用线程避免了频繁创建和销毁线程的开销；2. 资源管理，通过限制最大线程数来避免系统资源过度消耗；3. 任务调度，内置任务调度策略，有效管理任务执行；4. 线程复用，减少资源浪费。</div>
          </div>
          <div class="card-source">来源: JVM中的线程池管理 - 1.1 线程池的优势</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">配置一个ThreadPoolExecutor时，需要关注哪些核心参数？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">配置ThreadPoolExecutor的核心参数包括：corePoolSize（核心线程数）、maximumPoolSize（最大线程数）、keepAliveTime（非核心线程空闲存活时间）、TimeUnit（时间单位）、workQueue（任务队列）、threadFactory（线程创建工厂）和handler（拒绝策略）。</div>
          </div>
          <div class="card-source">来源: JVM中的线程池管理 - 3. 线程池的核心参数</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">关闭线程池时，shutdown() 和 shutdownNow() 方法有何区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">shutdown() 方法会平滑地关闭线程池，它会等待当前正在执行的任务全部完成后再关闭，但不接受新任务。而 shutdownNow() 方法会立即尝试停止所有正在执行的任务，并返回等待执行的任务列表，强制关闭线程池。</div>
          </div>
          <div class="card-source">来源: JVM中的线程池管理 - 4. 线程池的生命周期管理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">并发编程中，有哪些常见的策略可以用来避免死锁（Deadlock）？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">避免死锁的常见策略有：1. 锁顺序：所有线程按照固定的顺序获取锁，避免循环等待；2. 锁超时：使用带超时的锁请求机制，避免无限期等待；3. 尝试锁：使用tryLock()方法尝试获取锁，如果失败则放弃或采取其他措施，而不是阻塞等待。</div>
          </div>
          <div class="card-source">来源: 并发编程中的常见问题 - 2. 死锁 (Deadlock)</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
